ig.module(
    
    'game.utils'
    
).defines(function(){   
    
    VectorUtils = ig.Class.extend({
        
         multiply: function(ma,mb){
            var len = function(a){ return a.length; }
            if( len(ma[0]) != len(mb) )
                throw new Error("incompatible size!");
            var res = [];            
            
            for( var i = 0, m = len(ma); i < m; i++){                                
                res[i] = [];                
                for( var j = 0, q = len(mb[0]); j < q; j++){                                        
                    var sum = 0;
                    for( var k = 0, r = len(mb); k < r; k++){                        
                        sum += ma[i][k] * mb[k][j];                        
                    }                    
                    res[i][j] = sum;
                }                
            }
            return res;
        },
        rad: function( angle ){
            return angle * Math.PI / 180;
        },
        len: function( v ){
            return Math.sqrt( Math.pow(v.x,2) + Math.pow(v.y,2));
        },
        turn: function( v, angle ){
            var rad = this.rad( angle );
            r = this.multiply([[Math.cos( rad ), -Math.sin( rad )],
                               [Math.sin( rad ), Math.cos( rad )]], [[v.x],[v.y]]);
            return {
                x: r[0][0],
                y: r[1][0] 
            };
        },
        scale: function( v,k ){
            r = this.multiply([[k, 0],
                               [0, k]], [[v.x],[v.y]]);
            return {
                x: r[0][0],
                y: r[1][0] 
            };
        },
        scaleToLen: function( v, len ){            
            return this.scale( v, len / this.len( v ));
        },
        add: function( v, add ){
            return {
                x: v.x + add.x,
                y: v.y + add.y
            };
        },
        inverse: function( v ){
            return { x: -v.x, y: -v.y };
        }
    });
    
    ig.VUtils = new VectorUtils();
})